package Model.Inputs;

import Model.Main.Wire;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 ** @author citromos ezustfoka
 */
public abstract class Input {

    protected static final Logger logger =
            Logger.getLogger(Input.class.getName());
    protected int maxOutput = 1;
    protected Wire wire=null;
    protected boolean val;
    protected String name;

    /**
     *Itt állítjuk be a csak kimenettel rendelkező elemek értékét.
     * @param val Elem értéke, ami a kimenetén lesz,
     * @return
     * 
     */
    public void setState(Boolean val) {
        logger.log(Level.CONFIG, "" + this.getClass().getName() + " " + this.getName() + " value set to " + val + "");
        this.val = val;
    }

    /**
     * GetMaxOutput
     * @return 
     */
    public int getMaxOutput(){
        return maxOutput;
    }
    
    /**
     * Az elem kimenetére csatlakoztatott vezeték beállítása.
     * @param wire Az elem kimenetére csatlakoztatni kívánt wire.
     * @return
     *
     */
    public void setOutputWire(Wire wire) {
        logger.log(Level.FINEST, "" + this.getClass().getName() + " " + this.getName() + " output wire set to " + wire + "");
        this.wire = wire;
    }

    /**
     * Az elem kimenetére csatlakoztatott wire-nek meghívja a sendvalue függvényét.
     * @return
     * 
     */
    public void sendState() throws Exception {
        if (wire == null) {
            throw new Exception("Wire is not attached to the output!");
        }
        logger.log(Level.FINEST, "" + this.getClass().getName() + " " + this.getName() + " send to  " + wire.getClass().getName() + " " + wire.getName() + " " + this.val + "");

        this.wire.sendValue(this.val);
    }

    /**
     * Az elem kimenetére csatlakoztatott wire-t adja vissza.
     * @return
     *
     */
    public Wire getWire() {
        return wire;
    }

    /**
     * Beállítja  a nevét az objektumnak.
     * @param newName
     */
    public void setName(String newName) {
        this.name = newName;
    }

    /**
     * Visszaadja a nevét az objektumnak
     * @return
     */
    public String getName() {
        if (this.name != null) {
            return this.name;
        }
        return "Undefined";
    }

    /**
     * Visszaadja az értékét az objektumnak
     * @return
     */
    public Boolean getVal() {
        return (val);
    }
}
